#ifndef SESSIONFRIENDAREA_H
#define SESSIONFRIENDAREA_H

#include <QWidget>
#include <QScrollArea>
#include <QLabel>
#include <QPushButton>

///
/// \brief The ItemType enum 列表项类型枚举
/// \remarks 类型及其含义如下：
/// - SESSIONITEMTYPE：会话列表项
/// - FRIENDITEMTYPE：好友列表项
/// - APPLYITEMTYPE：好友申请列表项
enum ItemType {
    SESSIONITEMTYPE,
    FRIENDITEMTYPE,
    APPLYITEMTYPE
};

///
/// \brief The SessionFriendArea class 可滚动列表展示区域
///
class SessionFriendArea : public QScrollArea
{
    Q_OBJECT

    // ================================================
    // ===================【私有成员】===================
    // ================================================
private:
    QWidget *container = nullptr;

    // ================================================
    // ===================【公有方法】===================
    // ================================================
public:
    explicit SessionFriendArea(QWidget *parent = nullptr);
    void clear();
    void addItem(ItemType itemType, const QString& id, const QIcon &avatar, const QString &name, const QString &text);
    void addItem(const QIcon &avatar, const QString &name, const QString &text);
    void clickItem(int index);
}; // end SessionFriendArea

///
/// \brief The SessionFriendItem class 列表项基类
///
class SessionFriendItem : public QWidget
{
    Q_OBJECT

    // ================================================
    // ===================【私有成员】===================
    // ================================================
private:
    QWidget *owner = nullptr;   // 指向当前Item所属的Area实例的指针
    bool selected = false;      // 标示当前Item是否处于选中状态

    // ================================================
    // ===================【保护成员】===================
    // ================================================
protected:
    QLabel *messageLabel = nullptr; // 消息预览

    // ================================================
    // ===================【公有方法】===================
    // ================================================
public:
    SessionFriendItem(QWidget *owner, const QIcon &avatar, const QString &name, const QString &text);

    void paintEvent(QPaintEvent *event) override;
    void mousePressEvent(QMouseEvent *event) override;
    void enterEvent(QEnterEvent *event) override;
    void leaveEvent(QEvent *event) override;

    void select();
    virtual void active();
}; // end SessionFriendItem

///
/// \brief The SessionItem class 会话列表项
/// \remark 点击会话列表项后，在主界面右侧消息展示区加载历史消息列表
///
class SessionItem : public SessionFriendItem
{
    Q_OBJECT

    // ================================================
    // ===================【私有成员】===================
    // ================================================
private:
    QString chatSessionId = ""; // Item所属会话ID

    // ================================================
    // ===================【公有方法】===================
    // ================================================
public:
    SessionItem(QWidget *owner, const QString &chatSessionId, const QIcon &avatar, const QString &name, const QString &lastMessage);
    void active() override;
}; // end SessionItem

///
/// \brief The FriendItem class 好友列表项
/// \remark 点击好友列表项，列表区域切换到加载会话列表，并且选中好友列表项对应的会话
///
class FriendItem : public SessionFriendItem
{
    Q_OBJECT

    // ================================================
    // ===================【私有成员】===================
    // ================================================
private:
    QString userId = ""; // 好友的用户ID

    // ================================================
    // ===================【公有方法】===================
    // ================================================
public:
    FriendItem(QWidget *owner, const QString &userId, const QIcon &avatar, const QString &name, const QString &description);
    void active() override;

}; // end FriendItem

///
/// \brief The ApplyItem class 好友申请列表项
/// \remark 点击好友申请列表项本身无事发生，主要逻辑靠好友申请列表项中的"同意"、"拒绝"按钮触发
///
class ApplyItem : public SessionFriendItem
{
    Q_OBJECT

    // ================================================
    // ===================【私有成员】===================
    // ================================================
private:
    QString userId = ""; // 申请人的用户ID
    QPushButton *acceptBtn = nullptr;   // 好友申请同意按钮
    QPushButton *rejectBtn = nullptr;   // 好友申请拒绝按钮

    // ================================================
    // ===================【公有方法】===================
    // ================================================
public:
    ApplyItem(QWidget *owner, const QString &userId, const QIcon &avatar, const QString &name);
    void paintEvent(QPaintEvent *event) override;
    void active() override;

    // ================================================
    // ===================【私有方法】===================
    // ================================================
private:
    void acceptFriendApply();
    void rejectFriendApply();

}; // end ApplyItem

#endif // SESSIONFRIENDAREA_H
